#-*- coding: UTF-8 -*-
from pyramid.httpexceptions import HTTPFound
from pyramid.security import remember
from pyramid.security import forget




from scp.modelo.models import DBSession
from scp.modelo.Usuario import Usuario
from scp.modelo.Permiso import Permiso
from scp.modelo.Proyecto import Proyecto
from scp.modelo.Rol import Rol
from scp.modelo.AsignacionRecurso import AsignacionRecurso
from scp.modelo.Recurso import Recurso

from pyramid.response import Response
from pyramid.view import view_config
import json

from pyramid.security import authenticated_userid

import re

#@view_config(renderer='json')
def menus(request):
	"""Método controlador encargado de la creación dinámica del Panel de Menú de Navegación, de acuerdo a los roles del Usuario.
		URL asociada: /menus/{operacion}
		operacion:
			traerMenues, crea dinámicamente el panel de Navegación
		@param request: Petición Http del cliente. 	
	"""

	methodRequest = request.method
	dicParametros = request.matchdict
		
	if dicParametros.get('operacion') == 'traerMenus':
		
		
		#traemos el usuario logeado
		login = authenticated_userid(request)
		session = DBSession()
		usuario = session.query(Usuario).filter_by(username=login).first()
	
		#traemos sus roles, a traves de asignaciones
		#rolesUsuario = usuario.roles
		recursoSistema = session.query(Recurso).filter_by(tipo='S').first()
		asignacionesSistema = session.query(AsignacionRecurso).filter_by(usuario_id = usuario.id).all()
		rolesUsuario = []
		for asigSis in asignacionesSistema:
			rolesUsuario.append(asigSis.rol)
		
		mostrarMenuSistema = False
		mostrarMenuDesarrollo = False
		
		#agregado por Victor
		mostrarMenuGestion = False
		
		mostrarAdmUsuario = False
		mostrarAdmAtributos = False
		mostrarAdmRol = False
		mostrarAdmProyectos = False
		mostrarAdmTiposItems = False
		mostrarAdmFases = False
		
		#agregado por Victor
		mostrarGesProyectos = False
		
		
		for rol in rolesUsuario:
			permisos = rol.permisos
			for permiso in permisos:
				print '>>>permiso.nombre'
				print permiso.nombre
				
				if permiso.tipo == 'S':
					mostrarMenuSistema = True
				if permiso.tipo == 'P' or permiso.tipo == 'L':
					print '>>>permiso que hace mostrar el modulo de gestion'
					print permiso.nombre
					mostrarMenuGestion = True
					mostrarGesProyectos = True	
				if permiso.nombre == 'CREACION_USUARIO' or permiso.nombre == 'ELIMINACION_USUARIO' or permiso.nombre == 'EDICION_USUARIO' or permiso.nombre == 'VER_USUARIO':
					mostrarAdmUsuario = True	
				if permiso.nombre == 'CREACION_ATRIBUTO' or permiso.nombre == 'ELIMINACION_ATRIBUTO' or permiso.nombre == 'EDICION_ATRIBUTO' or permiso.nombre == 'VER_ATRIBUTO':
					mostrarAdmAtributos = True
				if permiso.nombre == 'CREACION_ROL' or permiso.nombre == 'ELIMINACION_ROL' or permiso.nombre == 'EDICION_ROL' or permiso.nombre == 'VER_ROL':
					mostrarAdmRol = True
				if permiso.nombre == 'CREACION_PROYECTO':
					mostrarAdmProyectos = True
					
					
					
		
		
		moduloSistema = {'text':'Administacion del Sistema','leaf':False, 'children':[]}
		moduloAdmUsuario = {'text':'Administacion de Usuarios','panel':'AdmUsers','leaf':True}
		moduloDesarrollo = {'text':'Modulo de Desarrollo','leaf':False, 'children':[]}
		moduloAdmAtributo = {'text':'Administacion de Atributos','panel':'AdmAtributos','leaf':True}
		moduloAdmRol = {'text':'Administacion de Roles','panel':'AdmRoles','leaf':True}
		moduloAdmProyecto = {'text':'Administacion de Proyectos','panel':'AdmProyectos','leaf':True}
		#agregado por Victor
		moduloGestion = {'text':'Gestion de Configuracion','leaf':False, 'children':[]}
		moduloGesProyecto = {'text':'Gestion de Proyectos','panel':'GesProyectos','leaf':True}
		
		session = DBSession()
		#proyectos = session.query(Proyecto).all()
		usuarioLogeado = session.query(Usuario).filter_by( username = authenticated_userid(request) ).first()
		proyectos = usuarioLogeado.proyectos
		
		print '>>>len(proyectos) en menus'
		print len(proyectos)
		
		
		#si tiene al menos un proyecto asignado le mostramos el menu de desarrollo
		if len(proyectos) > 0:
			moduloMisProyectos = {'text':'Desarrollo de mis Proyectos','leaf':False, 'children':[]}	
			proyectosJson = []
			for proyecto in proyectos:
				
				IdRecursoArray = []
				for Iter in proyecto.fases:
					aux = Iter.id
					recurso = session.query(Recurso).filter_by( fase_id = Iter.id ).one()
					IdRecursoArray.append(recurso.id)
				
				
				print '>>>IdRecursoArray'
				print IdRecursoArray
				
				asignacionesAll = session.query(AsignacionRecurso).filter(AsignacionRecurso.recurso_id.in_(IdRecursoArray)).filter(AsignacionRecurso.usuario_id == usuarioLogeado.id).all()
				
				print '>>>len(asignacionesAll) en munus'
				print len(asignacionesAll)
				
				exito = False
				for asignacion in asignacionesAll:
					if exito:
						break
					for permiso in asignacion.rol.permisos:
						if permiso.tipo == 'I' and permiso.nombre == 'VER_ITEM':
							exito = True
							break
				
				if (proyecto.estado == 'ACTIVO' or proyecto.estado == 'FINALIZADO' or proyecto.estado == 'ANULADO') and exito:
					mostrarMenuDesarrollo = True
					aux = {'text':proyecto.nombre,'panel':'DesarrolloProyecto','leaf':True, 'idProyecto':proyecto.id}
					moduloMisProyectos.get('children').append(aux)
		
		
		modulosEnviar = []
		if( mostrarMenuSistema == True ):
			
			if mostrarAdmUsuario == True:
				moduloSistema.get('children').append(moduloAdmUsuario)
			if mostrarAdmProyectos == True:
				moduloSistema.get('children').append(moduloAdmProyecto)	
			if mostrarAdmRol == True:
				moduloSistema.get('children').append(moduloAdmRol)	
			if mostrarAdmAtributos == True:
				moduloSistema.get('children').append(moduloAdmAtributo)
			
			
			modulosEnviar.append(moduloSistema)
		
		if mostrarMenuDesarrollo == True :
			#en duro estamos poniendo el módulo de Mis Proyectos
			moduloDesarrollo.get('children').append(moduloMisProyectos)					
			modulosEnviar.append(moduloDesarrollo)
		
		#agregado por Victor
		if( mostrarMenuGestion == True ):
			
			if mostrarGesProyectos == True:
				moduloGestion.get('children').append(moduloGesProyecto)
				modulosEnviar.append(moduloGestion)
		
		print modulosEnviar
		
		response = Response()			
		response.body = json.dumps( modulosEnviar )
		response.content_type = 'application/json'
		return response
	 
	
